Iptables là gì? Tại sao nên dùng? Sử dụng Iptables ra sao?

Nếu đã hoặc đang sử dụng hệ điều hành Linux thì có lẽ bạn sẽ biết đến Iptables. Vậy Iptables là gì? Nó có cấu trúc như thế nào? Sử dụng ra sao? Và tại sao chúng ta lại dùng Iptables? Tất cả sẽ được giải đáp trong bài viết bên dưới đây.

Iptables là gì?

Trong hệ điều hành Linux, tường lửa được thực thi tốt nhất bằng cách sử dụng netfilter. Đây là một kernel module quyết định packet nào được phép đi vào (input) hoặc đi ra bên ngoài (output).

Iptables là gì? Tại sao nên dùng? Sử dụng Iptables ra sao?1

iptables chỉ là interface cho netfilter và cả hai thường được coi là tương tự nhau. Một cách nhìn dễ hiểu hơn là nghĩ về nó như một backend và một frontend.

Tường lửa là gì?

Tường lửa quyết định các packet nào được phép đi vào (incoming) hay đi ra (outgoing) khỏi hệ thống.

Các packet ở Internet (hay bất kỳ network nào) đều giao tiếp bằng cách sử dụng các cổng (port). Ta có các port dành riêng cho các dịch vụ của hệ thống (ví dụ 22 – SSH, 3389 – Remote Desktop), và cho các dịch vụ phổ biến như NGINX hoặc Apache (là 80/443).

Ta cũng có các port được sử dụng bởi người dùng. Ví dụ: bạn có thể viết một ứng dụng web và cho nó chạy trên port 8000.

Để quyết định port nào được phép kết nối từ bên ngoài (hoặc thậm chí trên máy chủ cục bộ) là trách nhiệm của tường lửa. Bạn sẽ ra lệnh cho nó chấp nhận (allow), từ chối (reject) hoặc gỡ bỏ (drop) packet và nhiều thao tác khác.

Tại sao lại sử dụng iptables?

Bạn đã biết tường lửa và iptables là gì, hãy xem cách chúng ta có thể sử dụng chúng. Hầu hết mọi người sẽ đi tìm giải pháp đơn giản bằng cách sử dụng firewalld hoặc ufw.

firewalld và ufw rất đơn giản và đó là điều khiến chúng trở nên phổ biến. Tuy nhiên, sự đơn giản cũng làm giảm tính linh hoạt và không tận dụng hết các tính năng của iptables.

Riêng firewalld và ufw chỉ cho phép bạn chấp nhận hoặc từ chối một packet. Nhưng còn rất nhiều việc bạn có thể làm với một packet: NAT, ghi log, forward …

  • Đây là một công cụ đầy đủ tính năng cung cấp cho bạn mọi thứ bạn cần
  • Bạn có thể xử lý các packet linh hoạt hơn.
  • iptables cực kỳ thú vị và có thể sẽ khiến bạn cảm thấy cực kỳ tuyệt vời khi làm việc với chúng.
  • Bạn sẽ cảm thấy mình giống như một hacker hoặc một kẻ lập dị phi thường khi tự mình viết được những rule tuyệt vời chống lại các cuộc tấn công.

Cấu trúc - các thành phần của iptables

Để hiểu rõ iptables một cách cụ thể, ta hãy đi tìm hiểu chi tiết hơn về nó. Iptables bao gồm các thành phần khác nhau:

- Chain: Có 5 chain trong iptables và mỗi chain chịu trách nhiệm cho một nhiệm vụ cụ thể. Các chain này là: PREROUTING, INPUT, FORWARD, OUTPUT và POSTROUTING. Giống như tên gọi của chúng, chúng chịu trách nhiệm về các packet ngay khi nhận được, hoặc ngay trước khi định tuyến ra bên ngoài. - Table: các table khác nhau chịu trách nhiệm cho các nhiệm vụ khác nhau. Danh sách table bao gồm: filter, nat, mangle, raw và security. Hai table đầu được sử dụng nhiều nhất. Table filter chịu trách nhiệm lọc (filter) và hạn chế các packet đến máy chủ. Table nat chịu trách nhiệm về chuyển đổi địa chỉ mạng (NAT – Network Address Translation). - target: Các target chỉ định nơi packet sẽ đi. Điều này được quyết định bằng cách sử dụng các target của chính iptables: - ACCEPT (chấp nhận) - DROP (gỡ bỏ) - RETURN (quay trở lại) Hoặc target của các extension module, phổ biến nhất là DNAT, LOG, MASQUERADE, REJECT, SNAT, TRACE và TTL. Các target được chia thành có kết thúc và không kết thúc. Các target có kết thúc chấm dứt rule và các packet sẽ bị ngừng ở đó. Nhưng các target không kết thúc sẽ xử lý packet theo một cách nào đó và rule sẽ được thực hiện tiếp tục sau đó.

Chain iptables là gì?

Mỗi chain chịu trách nhiệm cho một nhiệm vụ cụ thể. Vì vậy, chúng ta hãy tìm hiểu sâu hơn một chút.

PREROUTING:

Chain này quyết định điều gì sẽ xảy ra với một packet ngay khi nó tới Network Interface. Chúng ta có các tùy chọn khác nhau như thay đổi packet (có thể là NAT), bỏ packet hoặc không làm gì cả và để nó tiếp tục di chuyển và được xử lý ở nơi khác trên đường đi.

INPUT:

Đây là một trong những chain phổ biến vì nó hầu như luôn chứa các rule nghiêm ngặt để kiểm soát truy cập từ internet gây hại cho máy tính của chúng ta. Nếu bạn muốn mở hay chặn một port thì đây là nơi bạn sẽ làm điều đó.

FORWARD:

Chain này chịu trách nhiệm forward packet. Chúng ta có thể coi máy tính như một bộ định tuyến (router) và đây là nơi mà một số quy tắc (rule) có thể áp dụng để thực hiện công việc.

OUTPUT:

Chịu trách nhiệm cho tất cả quá trình truy cập ra bên ngoài. Bạn không thể gửi một packet mà không được sự cho phép. Đó là nơi tốt nhất để hạn chế lưu lượng outgoing của bạn nếu bạn không chắc chắn mỗi ứng dụng đang giao tiếp qua cổng nào.

POSTROUTING:

Chain này là nơi các packet để lại dấu vết cuối cùng, trước khi rời khỏi máy tính của chúng ta. Điều này được sử dụng để định tuyến (routing) trong số nhiều tác vụ khác để đảm bảo các packet được xử lý theo cách chúng ta muốn.

Hầu hết các trường hợp, bạn sẽ sử dụng thường xuyên chain INPUT & OUTPUT.

Các table iptables

Hầu hết thao tác bạn sẽ sử dụng chính trên table filter. Nếu khi viết rule, bạn không chỉ định bất kỳ table nào, filter được sử dụng theo mặc định. Vì vậy, hãy ghi nhớ điều đó. Và tiếp tục dưới đây, tôi sẽ giải thích từng table:

filter: là table được sử dụng nhiều nhất hàng ngày. Đó là lý do tại sao nó là table mặc định. Trong table này, bạn sẽ quyết định xem packet có được phép vào (input) hoặc ra (output) khỏi máy tính của bạn hay không. Nếu bạn muốn chặn một port để ngừng nhận bất cứ thứ gì, đây là điểm table bạn cần. nat: Table này là table phổ biến thứ hai và chịu trách nhiệm tạo kết nối mới. Đó là cách viết tắt của Network Address Translation. mangle: table này dùng để thay đổi dữ liệu bên trong các packet trước khi chúng đến hoặc ra khỏi máy tính. raw: table này xử lý packet raw chưa qua xử lý như tên gọi của nó. Chủ yếu là để theo dõi trạng thái kết nối. Chúng ta sẽ thấy các ví dụ về điều này bên dưới khi muốn cho các packet thành công từ kết nối SSH. security: có nhiệm vụ đánh dấu những gói tin có liên quan đến context của SELinux, nó giúp cho SELinux hoặc các thành phần khác hiểu được context SELinux và xử lý gói tin.

Bắt đầu từ đâu?

Để bắt đầu, chỉ cần tắt các hệ thống phụ trợ tường lửa khác của bạn, để chỉ còn lại một cấu hình duy nhất đó là iptables.

Nếu bạn đang sử dụng máy debian, hãy sử dụng

systemctl disable --now ufw

Nếu bạn đang sử dụng máy làm redhad, hãy sử dụng

systemctl disable --now firewalld

Sau đó, bạn có thể bắt đầu thiết lập cấu hình tường lửa của mình thông qua iptables.

Hướng dẫn cách sử dụng iptables

Khi nắm rõ khái niệm iptables là gì, sau đây sẽ hướng dẫn cách thực hiện một số tác vụ trong iptables.

Liệt kê cấu hình hiện tại:

iptables -L -n -v --line-numbers

-L liệt kê danh sách. -n cho output là số (không phân giải tên; dẫn đến hiệu suất nhanh hơn). -v thêm thông tin chi tiết Để chặn mọi packet input hoặc output khỏi hệ thống một cách mặc định khi chúng không match rule nào (còn được gọi là default Policy):

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

-P cho policy. Có các policy khác nhau như đã đề cập ở trên. Cho phép các packet bên trong local interface của bạn khi di chuyển mà không bị chặn.

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

-A để chèn rule vào cuối chain. Bạn cũng có thể chèn, xóa hoặc cập nhật bằng các chuyển đổi khác nhau. -i dành cho input interface, interface mà các packet tới. -o dành cho output interface, interface mà các packet đi ra. -j để jump đến TARGET. Bạn có thể chọn ACCEPT, REJECT, DROP, LOG… với một packet. Để cho phép các gói DNS và DHCP input và output ra khỏi máy tính của bạn.

iptables -A INPUT -p udp --dport 67 -j ACCEPT
iptables -A INPUT -p tcp --dport 67 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 68 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 68 -j ACCEPT

-p dành cho giao thức. Các giao thức khác nhau có thể được sử dụng như tcp, udp, gre, v.v. Thông thường DNS và DHCP giao tiếp thông qua giao thức UDP. Nhưng với các packet lớn hơn, TCP thường được sử dụng. Đó là lý do tại sao tôi đề cập đến các rule đó. –dport cho destination port. Bạn cũng có thể sử dụng –sport cho source port. Để mở kết nối SSH khi máy tính của bạn là máy client, bạn phải thêm hai rule theo cả hai hướng.

iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

-m là một options để sử dụng extension của iptables. Bạn có thể đọc thêm về các extension khác nhau bằng cách sử dụng man iptables-extension. Ví dụ khác về các phần mở rộng này là limit để hạn chế số lượng tần số packet. Kết nối SSH không chỉ xảy ra theo một hướng duy nhất. Thay vào đó, bạn sẽ gửi một packet đến destination port 22, và các packet sẽ đến máy tính của bạn với trạng thái RELATED và ESTABLISHED. Connection tracking phân biệt điều này cho bạn và bạn không phải lo lắng về điều đó.

Cho phép kết nối SSH khi máy tính của bạn là máy chủ.

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Đây là hướng ngược lại với rule trước đó, mở các packet đến port 22 và gửi các packet thành công có trạng thái RELATED và ESTABLISHED trở lại client.

Nếu bạn muốn có thể ping các máy tính khác và cho phép các máy tính khác có thể ping máy tính của bạn, bạn nên cho phép các packet icmp.

iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT

Nếu bạn muốn có thể duyệt các trang web, đây là điều bạn nên làm.

iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

Thao tác này sẽ cho phép cả lưu lượng HTTP và HTTPS ra khỏi hệ thống của bạn.

Bạn muốn ghi lại các packet bị DROP để bạn có cái nhìn về những gì đang xảy ra. Nó cũng sẽ giúp bạn nếu bạn muốn mở một port trong tương lai.

iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A OUTPUT -j LOGGING
iptables -A FORWARD -j LOGGING
iptables -A LOGGING -j LOG --log-level error --log-prefix "iptables-dropped: "
iptables -A LOGGING -j DROP

Dòng đầu tiên tạo ra một chain mới. Và trong 3 dòng tiếp theo, chúng ta sẽ forward các packet đến chain mới được tạo.

2 dòng cuối cùng cũng sẽ log lại packet và DROP packet đó.

–log-prefix là một tham số của LOG target, mà bạn có thể đọc thêm về phần man iptables-extension. –log-level cũng là tham số của LOG target, chỉ ra cách chúng ta muốn ghi log chi tiết như thế nào. error là một mức độ ghi khá tốt vì chúng ta chỉ quan tâm đến các packet không được phép. Sự khác biệt giữa DROP và REJECT là DROP không thông báo cho người gửi về packet bị gỡ bỏ, mà REJECT sẽ thông báo cho người gửi một cách rõ ràng.

Khi bạn gửi một packet đến mục tiêu REJECT, người gửi sẽ nhận được “connection reset by peer”

Nếu bạn muốn áp dụng NAT cho iptables của mình, tùy thuộc vào việc bạn muốn áp dụng nó cho các kết nối input hay kết nối output hoặc địa chỉ IP của máy tính của bạn là tĩnh hay động, bạn có thể sử dụng các quy tắc sau.

iptables -t nat -A OUTPUT -p tcp --dport 22 --destination 192.168.40.40 -j DNAT --to-destination 123.123.123.123:4040

Sau lệnh trên, mọi lưu lượng đi từ máy tính của bạn đến địa chỉ IP 192.168.40.40 port 22 sẽ được gửi đến địa chỉ IP 123.123.123.123 port 4040.

Cờ –destination sẽ lọc các packet dựa trên destination IP.

Khi muốn phủ định rule thì hãy sử dụng dấu chấm than !

Vì vậy, bạn có thể phủ định một rule bằng cách đặt trước nó bằng dấu !. Ví dụ ! –source 192.168.40.40 sẽ có hiệu lực đối với bất kỳ source IP nào ngoài 192.168.40.40.

iptables -t nat -A POSTROUTING -p tcp --dport 80 -j SNAT --to-source 10.0.0.56:8000-8010

Sau khi áp dụng rule trên, mọi packet cho bất kỳ destination IP cùng với cổng 80 sẽ thay đổi địa chỉ nguồn thành 10.0.0.56:8000-8010, là một dải cổng được chỉ định bằng dấu gạch ngang. Điều này giúp NAT bên trong mạng nội bộ của bạn có thể truy cập được từ thế giới bên ngoài (internet).

iptables -A FORWARD -i wlan0 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

MASQUERADE phù hợp nhất khi bạn cần forward mọi traffic từ một Interface cụ thể để được định tuyến qua máy tính của bạn mà không cần thay đổi bất kỳ thứ gì bên trong packet. Tất nhiên, bạn sẽ cần thiết lập tham số kernel trước khi thiết lập việc thực hiện các thao tác trên:

sysctl net.ipv4.ip_forward=1

Để máy tính của bạn có khả năng routing các packet. Lệnh trên chỉ là một thiết lập cấu hình runtime và nếu bạn cần có hiệu lực khi khởi động lại, bạn sẽ thực hiện như sau.

echo net.ipv4.ip_forward = 1 > /etc/sysctl.d/30-ip-forward.conf

iptables là một công cụ với phần lớn các tính năng. Các lệnh trên là những lệnh được sử dụng nhiều nhất. Và thỉnh thoảng bạn sẽ thấy mình đang sử dụng lệnh này hoặc lệnh kia.

Đọc kỹ hướng dẫn sử dụng vì họ có thông tin chi tiết tốt:

man iptables
man iptables-extension
  Phần kết:

Thông qua bài viết này, chúng tôi hi vọng bạn đọc đã hiểu hơn về iptables cũng như cách sử dụng công cụ này. Chúc bạn thành thạo với iptables.

Nguồn bài: Tổng hợp